#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    std::string image_path = "../roi_img.jpg";
    cv::Mat img = cv::imread(image_path);

    // 检查图像是否成功读取
    if (img.empty()) {
        std::cerr << "Error: Image not found or unable to open the image at path: " << image_path << std::endl;
        return -1;
    }

    // 改变颜色空间 BGR -> Gray
    cv::Mat img_gray;
    cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);

    // 改变颜色空间 BGR -> HSV
    cv::Mat img_hsv;
    cv::cvtColor(img, img_hsv, cv::COLOR_BGR2HSV);

    // 显示图像（可以取消注释来查看图像）
    // cv::imshow("LingXiao", img);
    // cv::imshow("gray", img_gray);
    // cv::imshow("hsv", img_hsv);

    // 打开视频文件
    cv::VideoCapture cap("../roi.mp4");

    if (!cap.isOpened()) {
        std::cerr << "Error: Unable to open video file!" << std::endl;
        return -1;
    }

    while (true) {
        cv::Mat frame;
        // 读取每一帧
        cap >> frame;
        if (frame.empty()) {
            break; // 如果没有读取到帧，退出循环
        }

        // BGR -> HSV
        cv::Mat hsv;
        cv::cvtColor(frame, hsv, cv::COLOR_BGR2HSV);

        // 定义蓝色的HSV范围
        cv::Scalar lower_blue(90, 50, 50);
        cv::Scalar upper_blue(130, 255, 255);

        // 对HSV图像进行阈值处理，提取蓝色区域
        cv::Mat mask;
        cv::inRange(hsv, lower_blue, upper_blue, mask);

        // 进行按位与操作，提取蓝色区域
        cv::Mat res;
        cv::bitwise_and(frame, frame, res, mask);

        // 显示结果
        cv::imshow("frame", frame);
        cv::imshow("mask", mask);
        cv::imshow("res", res);

        // 等待按键，如果按下ESC键则退出
        std::cout << "Press ESC to close the windows." << std::endl;
        int key = cv::waitKey(0);
        if (key == 27) { // ESC 键
            break;
        } else {
            std::cout << "Key pressed: " << key << std::endl;
        }
    }

    // 关闭所有窗口
    cv::destroyAllWindows();
    return 0;
}
